﻿''============================================================================
''OMANE - Choix des paramètres de l'étude du taux garanti
''Copyright © 2010 PIERRE TISSOT CONSEIL / NATIXIS ASSURANCES
''=============================================================================
Imports PTIC_Util
Imports PTIC_GestionBDD
Imports Actuariat

Public Class frmDonneesTechniques
    Implements IObserver

#Region "Variables de classe"

#Region "Paramètres liés à l'affichage"

    Protected dv_vueTarifs As DataView
    Protected dv_vueMortH As DataView
    Protected dv_vueMortF As DataView
    Protected dv_vueINCINVtaux As DataView
    Protected dv_vueINCINVtauxM2 As DataView
    Protected dv_vueINCINVfra As DataView

    Private _correspTxtBox_Param As String(,)

    'Variable permettant de gérer les mises à jour des textBox de paramétrage
    Dim _TxtPrecPosCurseur As Integer

    'Variable permettant de bloquer ou non la méthode qui s'exécute lorsque le texte d'une des textBox
    'de paramétrage est modifié
    Dim txtParamPriseEnCompteModifs As Boolean
    'Variable permettant de bloquer l'actualisation des textBox
    Dim _bln_actualiseTextBox As Boolean = True

    'Nom du bouton coché sur l'onglet de paramétrage technique de la garantie DC
    Dim nomBouttonCocheDC As String = "Rdb_Param13"
    'Nom du bouton coché sur l'onglet de paramétrage technique de la garantie INCINV
    Dim nomBouttonCocheINCINV As String = "Rdb_Param20"
    'Nom du bouton coché sur l'onglet de paramétrage technique des estimateurs
    Dim nomBouttonCocheEst As String = "Rdb_Param25"

    Protected _ltvDest As ListView
    Protected _ltvSource As ListView
    Protected _ctrlSource As System.Windows.Forms.Control
    Protected _ctrlCible As System.Windows.Forms.Control
    Protected _mouseDown As Boolean = False

#End Region

#Region "Fonctions métier"
    'Univers de travail, récupéré depuis la fenêtre d'ossature de l'application et destiné à être paramétré
    Protected _universBDD As UniversOMANE
    Protected _controleurOMANE As Controleur
    Protected _controleurParametres As IListControleursParametres
#End Region

#End Region

#Region "Création d'une instance"
    Public Sub New(ByVal univers As UniversOMANE, _
                   ByVal controleurOMANE As Controleur)
        'Méthode requise par le concepteur
        InitializeComponent()
        'Initialisation des variables de classe
        Me._universBDD = univers
        initCorrespNomObjBox_Param()
        Me._controleurOMANE = controleurOMANE
        Me._controleurParametres = controleurOMANE.controleListeParametres

        dv_vueTarifs = New DataView
        dv_vueTarifs.Table = _universBDD.refListeTablesReferentiel
        dv_vueTarifs.RowFilter = "strTypeTable='TARIF'"
        cbx_ParamTarifs.DisplayMember = "strNomTable"
        cbx_ParamTarifs.ValueMember = "strNomFichier"
        cbx_ParamTarifs.DataSource = dv_vueTarifs


        'Initialisation du dataBinding des listes de choix liées aux tables de mortalité et d'incap/inval
        dv_vueMortH = New DataView()
        dv_vueMortH.Table = _universBDD.refListeTablesReferentiel
        dv_vueMortH.RowFilter = "strTypeTable='DC'"
        cbx_ParamMortH.DisplayMember = "strNomTable"
        cbx_ParamMortH.ValueMember = "strNomFichier"
        cbx_ParamMortH.DataSource = dv_vueMortH

        dv_vueMortF = New DataView()
        dv_vueMortF.Table = _universBDD.refListeTablesReferentiel
        dv_vueMortF.RowFilter = "strTypeTable='DC'"
        cbx_Param11.DisplayMember = "strNomTable"
        cbx_Param11.ValueMember = "strNomFichier"
        cbx_Param11.DataSource = dv_vueMortF

        dv_vueINCINVtaux = New DataView()
        dv_vueINCINVtaux.Table = _universBDD.refListeTablesReferentiel
        dv_vueINCINVtaux.RowFilter = "strTypeTable='MAINTINCINV'"
        cbx_Param17V2.DisplayMember = "strNomTable"
        cbx_Param17V2.ValueMember = "strNomFichier"
        cbx_Param17V2.DataSource = dv_vueINCINVtaux

        dv_vueINCINVtauxM2 = New DataView()
        dv_vueINCINVtauxM2.Table = _universBDD.refListeTablesReferentiel
        dv_vueINCINVtauxM2.RowFilter = "strTypeTable='MAINTINCINV_NB_MENS'"
        cbxParam31.DisplayMember = "strNomTable"
        cbxParam31.ValueMember = "strNomFichier"
        cbxParam31.DataSource = dv_vueINCINVtauxM2

        dv_vueINCINVfra = New DataView()
        dv_vueINCINVfra.Table = _universBDD.refListeTablesReferentiel
        dv_vueINCINVfra.RowFilter = "strTypeTable='FRAINCINV'"
        cbx_Param18V2.DisplayMember = "strNomTable"
        cbx_Param18V2.ValueMember = "strNomFichier"
        cbx_Param18V2.DataSource = dv_vueINCINVfra

        'Initialisation du dataBinding des listes de choix liées aux tables de mortalité
        txtParamPriseEnCompteModifs = True

    End Sub
    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
        MyBase.OnLoad(e)
        dgv_ParamSegDC.DefaultCellStyle.Font = New Font("Tahoma", 9, FontStyle.Regular)
        dgv_ParamSegINCINV.DefaultCellStyle.Font = New Font("Tahoma", 9, FontStyle.Regular)
        dgv_ParamSegEst.DefaultCellStyle.Font = New Font("Tahoma", 9, FontStyle.Regular)
        PtiC_LabelParamDC.Text = "Paramétrage : " & _controleurParametres.getDescription(nomPres_GarantiePTIA)
        PtiC_LabelParamINCINV.Text = "Paramétrage : " & _controleurParametres.getDescription(nomTx_abat_MalaNonObje)
        PtiC_LabelParamEst.Text = "Paramétrage : " & _controleurParametres.getDescription(nomDuree_Actu)
    End Sub
    ''' <summary>
    ''' Initialisation du tableau de correspondance entre les clés d'accès aux paramètres du contrôleur
    ''' et les noms des contrôles associés aux valeurs uniques (TextBox ou ComboBox)
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub initCorrespNomObjBox_Param()
        Dim i As Integer
        ReDim _correspTxtBox_Param(31, 4)
        For i = 0 To 31
            _correspTxtBox_Param(i, 0) = "txt_Param" & CStr(i)
        Next i
        _correspTxtBox_Param(0, 1) = csteParam.nomTx_TaxeAssu
        _correspTxtBox_Param(1, 1) = csteParam.nomTx_TechA
        _correspTxtBox_Param(2, 1) = csteParam.nomTx_RembAntiA
        _correspTxtBox_Param(3, 1) = csteParam.nomTx_RendActifsA
        _correspTxtBox_Param(4, 1) = csteParam.nomTx_TaxeImpoA
        _correspTxtBox_Param(5, 1) = csteParam.nomTx_RendActionnairesA
        _correspTxtBox_Param(6, 1) = csteParam.nomTx_CoutEmprSuboA
        _correspTxtBox_Param(7, 1) = csteParam.nomTx_fraiGestA
        _correspTxtBox_Param(8, 1) = csteParam.nomTx_CommiContA
        _correspTxtBox_Param(9, 1) = csteParam.nomTx_CouvEmprSuboA
        _correspTxtBox_Param(10, 1) = csteParam.nomTx_FondPropSurMSR
        _correspTxtBox_Param(11, 0) = "cbx_Param11"
        _correspTxtBox_Param(11, 1) = csteParam.nomTable_Mortalite_F
        _correspTxtBox_Param(12, 1) = csteParam.nomAge_FinDC
        _correspTxtBox_Param(13, 0) = "cbx_Param13"
        _correspTxtBox_Param(13, 1) = csteParam.nomPres_GarantiePTIA
        _correspTxtBox_Param(14, 1) = csteParam.nomTx_PrixGarantiePTIA
        _correspTxtBox_Param(15, 1) = csteParam.nomTx_Majo_sinDCPTIA
        _correspTxtBox_Param(16, 0) = "NumUpDown_Param16"
        _correspTxtBox_Param(16, 1) = csteParam.nomSel_medic
        _correspTxtBox_Param(17, 0) = "cbx_Param17V2"
        _correspTxtBox_Param(17, 1) = csteParam.nomTble_maintien_incinv
        _correspTxtBox_Param(18, 1) = csteParam.nomAge_FinINCINV
        _correspTxtBox_Param(19, 1) = csteParam.nomfranchise_INCAP
        _correspTxtBox_Param(20, 1) = csteParam.nomTx_abat_MalaNonObje
        _correspTxtBox_Param(21, 1) = csteParam.nomTx_abat_ExclPerteRev
        _correspTxtBox_Param(22, 1) = csteParam.nomTx_MajoPrudSinINCINV
        _correspTxtBox_Param(23, 1) = csteParam.nomTx_chgtSecuINCINV
        _correspTxtBox_Param(24, 1) = csteParam.nomTx_mensEntreeINCINV
        _correspTxtBox_Param(25, 1) = nomDuree_Actu
        _correspTxtBox_Param(26, 1) = nomTxNom_Actu
        _correspTxtBox_Param(27, 1) = nomTxMort_Actu
        _correspTxtBox_Param(28, 0) = "cbx_ParamMortH"
        _correspTxtBox_Param(28, 1) = csteParam.nomTable_Mortalite_H
        _correspTxtBox_Param(29, 0) = "cbx_Param18V2"
        _correspTxtBox_Param(29, 1) = csteParam.nomtble_maintien_incinvFRA
        _correspTxtBox_Param(30, 0) = "cbx_ParamTarifs"
        _correspTxtBox_Param(30, 1) = csteParam.nomGrilleTarifaire
        _correspTxtBox_Param(31, 0) = "cbxParam31"
        _correspTxtBox_Param(31, 1) = csteParam.nomTble_maintien_incinvM2

        For i = 0 To 31
            _correspTxtBox_Param(i, 2) = "lbl_Param" & CStr(i)
            If i <= 10 Then _correspTxtBox_Param(i, 3) = "lbl_ParamUnite" & CStr(i) Else _correspTxtBox_Param(i, 3) = ""
            _correspTxtBox_Param(i, 4) = ""
            If 13 <= i And i <= 16 Then
                _correspTxtBox_Param(i, 4) = "Rdb_Param" & CStr(i)
            End If
            If 20 <= i And i <= 24 Then
                _correspTxtBox_Param(i, 4) = "Rdb_Param" & CStr(i)
            End If
            If (25 <= i And i <= 27) Then
                _correspTxtBox_Param(i, 4) = "Rdb_Param" & CStr(i)
            End If
        Next

    End Sub
#End Region

#Region "Correspondances clés d'accès contrôleur / nom des contrôles"
    'Renvoie l'objet paramètre associé au bouton coché
    Public Function recup_paramFromNomButtonChecked(ByVal nomButtonChecked As String) As String
        Dim indiceButtonChecked As String = _
            Microsoft.VisualBasic.Right(nomButtonChecked, Len(nomButtonChecked) - 9)
        Dim nomControlParam As String = ""
        If indiceButtonChecked = "13" Then
            nomControlParam = "cbx_Param13"
        ElseIf indiceButtonChecked = "16" Then
            nomControlParam = "NumUpDown_Param16"
        Else
            nomControlParam = "txt_Param" & indiceButtonChecked
        End If
        Return cleParamFromTxtBox(nomControlParam)
    End Function
    Public Function cleParamFromTxtBox(ByVal txtBoxName As String) As String
        Dim i As Integer, result As String = ""
        For i = 0 To _correspTxtBox_Param.GetUpperBound(0)
            If _correspTxtBox_Param(i, 0) = txtBoxName Then
                result = _correspTxtBox_Param(i, 1)
            End If
        Next
        Return result
    End Function
    Public Function txtBoxFromClePara(ByVal cleParamName As String)
        Dim i As Integer, result As String = ""
        For i = 0 To _correspTxtBox_Param.GetUpperBound(0)
            If _correspTxtBox_Param(i, 1) = cleParamName Then
                result = _correspTxtBox_Param(i, 0)
            End If
        Next
        Return result
    End Function
    Public Function getCorrespParamTxt() As String(,)
        Return _correspTxtBox_Param
    End Function
#End Region

#Region "Onglets de paramétrage technique"

#Region "Choix de la méthode de calcul"
    Private Sub rdb_equTarifaire_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles rdb_equTarifaire.CheckedChanged
        If rdb_equTarifaire.Checked = True Then
            'Activation de tous les paramètres de la méthode 2
            _controleurOMANE.setMethodeCalcul(1)
        Else
            _controleurOMANE.setMethodeCalcul(2)
        End If
    End Sub
#End Region

#Region "Gestion des valeurs uniques"

    Private Sub txtParam_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) _
        Handles txt_Param0.Validating, txt_Param1.Validating, txt_Param2.Validating, txt_Param3.Validating, _
                txt_Param4.Validating, txt_Param5.Validating, txt_Param6.Validating, txt_Param7.Validating, _
                txt_Param9.Validating, txt_Param10.Validating, txt_Param12.Validating, _
                txt_Param14.Validating, txt_Param15.Validating, txt_Param18.Validating, txt_Param20.Validating, _
                txt_Param21.Validating, txt_Param22.Validating, txt_Param23.Validating, txt_Param24.Validating, _
                txt_Param25.Validating, txt_Param26.Validating

        'La valeur du paramètre stockée dans le modèle est égale à sa dernière valeur valide
        'Ici, on cherche à savoir s'il faut ou non mettre à jour le paramètre
        Dim txt_Param As PTIC_Composants_WF.PTIC_NumFormatedTextBox
        txt_Param = CType(sender, TextBox)
        Dim nomParametre As String = cleParamFromTxtBox(txt_Param.Name)
        Dim result As resultatValidationContraintes = _
            _controleurParametres.isValeurUniqueAfficheeValide(nomParametre, txt_Param.Text)

        If Not e.Cancel = True Then
            If Not result.isValide Then
                e.Cancel = True
                txt_Param.Select(0, txt_Param.Text.Length)
                ErrorProvider1.SetError(txt_Param, result.msg)
            End If
        End If
    End Sub
    Private Sub txtParam_Validated(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles txt_Param0.Validated, txt_Param1.Validated, txt_Param2.Validated, txt_Param3.Validated, _
                txt_Param4.Validated, txt_Param5.Validated, txt_Param6.Validated, txt_Param7.Validated, _
                txt_Param9.Validated, txt_Param10.Validated, txt_Param12.Validated, _
                txt_Param14.Validated, txt_Param15.Validated, txt_Param18.Validated, txt_Param20.Validated, _
                txt_Param21.Validated, txt_Param22.Validated, txt_Param23.Validated, txt_Param24.Validated, _
                txt_Param25.Validated, txt_Param26.Validated

        Dim txt_Param As PTIC_Composants_WF.PTIC_NumFormatedTextBox
        txt_Param = CType(sender, PTIC_Composants_WF.PTIC_NumFormatedTextBox)
        Dim nomParametre As String = cleParamFromTxtBox(txt_Param.Name)

        _controleurParametres.setValeurUniqueFromValeurAffichee(nomParametre, txt_Param.value)
    End Sub
    Private Sub cbx_ParamMort_SelectedValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles cbx_ParamMortH.SelectedValueChanged, cbx_Param11.SelectedValueChanged, _
            cbx_Param13.SelectedValueChanged, cbx_ParamTarifs.SelectedValueChanged

        'Récupération de la comboBox ayant été modifiée
        Dim cbx As ComboBox = CType(sender, ComboBox)
        'Récupération de la clé d'accès au paramètre
        Dim nomParametre As String = cleParamFromTxtBox(cbx.Name)

        Dim result As New resultatValidationContraintes

        If Not cbx.SelectedValue Is Nothing Then
            result = _controleurParametres.setValeurUniqueFromObject(nomParametre, cbx.SelectedValue)
            If cbx Is cbx_Param13 Then
                'Mise à jour de la dataTable pour une valeur unique
                actualiseParamDataGridView(nomParametre)
            End If
        End If

    End Sub
    Private Sub NumUpDown_Param16_ValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles NumUpDown_Param16.ValueChanged
        ''MsgBox("La valeur max du déroulement de la sélection médicale a changé")
        'Récupération du contrôleur de la sélection médicale
        Dim controleSelMedic As controleurSelectionMedicale = _controleurParametres.getControleur(nomSel_medic)
        controleSelMedic.setNbMaxDeroulement(NumUpDown_Param16.Value)
        If NumUpDown_Param16.Value = 0 Then
            Dim reqParam As RequeteBDD = _universBDD.listeTraitements.getTraitRegSegmentationParam(nomSel_medic)
            Dim listDescr As New List(Of String)
            For Each corresp As Correspondance In reqParam.ListeChampsSortie.Values
                listDescr.Add(corresp.description)
            Next
            For Each descr As String In listDescr
                reqParam.removeSELECT(descr)
            Next
        End If
    End Sub

#End Region

#Region "Gestion des radioButton de sélection du paramètre actif de la fenêtre"
    Private Sub Rdb_Param_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles _
        Rdb_Param13.Click, Rdb_Param14.Click, Rdb_Param15.Click, Rdb_Param16.Click, _
        Rdb_Param20.Click, Rdb_Param21.Click, Rdb_Param22.Click, Rdb_Param24.Click, _
        Rdb_Param25.Click, Rdb_Param26.Click, Rdb_Param27.Click

        Dim nomParametre As String, ltvAMAJ As New ListView, dgvAMAJ As New DataGridView
        Dim nomBouttonCoche As String

        'Récupération de l'indice du bouton coché
        nomBouttonCoche = CType(sender, RadioButton).Name
        nomParametre = recup_paramFromNomButtonChecked(nomBouttonCoche)

        Dim indiceButtonChecked As String = _
            Microsoft.VisualBasic.Right(nomBouttonCoche, Len(nomBouttonCoche) - 9)

        If indiceButtonChecked >= 13 And indiceButtonChecked <= 16 Then
            nomBouttonCocheDC = nomBouttonCoche
            PtiC_LabelParamDC.Text = "Paramétrage : " & _controleurParametres.getDescription(nomParametre)
        ElseIf indiceButtonChecked >= 20 And indiceButtonChecked <= 24 Then
            nomBouttonCocheINCINV = nomBouttonCoche
            PtiC_LabelParamINCINV.Text = "Paramétrage : " & _controleurParametres.getDescription(nomParametre)
        Else
            nomBouttonCocheEst = nomBouttonCoche
            PtiC_LabelParamEst.Text = "Paramétrage : " & _controleurParametres.getDescription(nomParametre)
        End If

        NumUpDown_Param16.Enabled = Rdb_Param16.Checked
        actualiseParamDataGridView(nomParametre)
        actualiseParamLtv(nomParametre)
    End Sub
#End Region

#Region "Gestion des dataGridView affichant les valeurs du paramètre actif de la fenêtre"

    Private Sub dgv_ParamSeg_DragEnter(ByVal sender As Object, _
                                         ByVal e As System.Windows.Forms.DragEventArgs) _
                                         Handles dgv_ParamSegDC.DragEnter, dgv_ParamSegINCINV.DragEnter, _
                                         dgv_ParamSegEst.DragEnter
        e.Effect = DragDropEffects.Move
    End Sub
    Private Sub dgv_ParamSeg_MouseDown(ByVal sender As System.Object, _
                                         ByVal e As System.Windows.Forms.MouseEventArgs) _
                                         Handles dgv_ParamSegDC.MouseDown, dgv_ParamSegINCINV.MouseDown, _
                                         dgv_ParamSegEst.MouseDown
        _mouseDown = True
        CType(sender, PTIC_Composants_WF.PTIC_DataGridView_V2).PTIC_DataGridView_V2_MouseDown(sender, e)

    End Sub
    Private Sub dgv_ParamSegEst_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) _
        Handles dgv_ParamSegDC.MouseUp, dgv_ParamSegINCINV.MouseUp, dgv_ParamSegEst.MouseUp
        _mouseDown = False
    End Sub
    Private Sub dgv_ParamSegEst_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) _
        Handles dgv_ParamSegDC.MouseMove, dgv_ParamSegINCINV.MouseMove, dgv_ParamSegEst.MouseMove
        If _mouseDown Then
            _mouseDown = False
            Dim dgvSource As DataGridView = CType(sender, DataGridView)
            _ctrlSource = dgvSource

            Dim x_pos As Integer, y_pos As Integer
            Dim objMousePosition As Point = dgvSource.PointToClient(Control.MousePosition)
            Dim objHitTestInfo As DataGridView.HitTestInfo

            'Récupération de la position du click dans les coordonnées de la dataGridView
            objHitTestInfo = dgvSource.HitTest(objMousePosition.X, objMousePosition.Y)
            x_pos = objHitTestInfo.RowIndex
            y_pos = objHitTestInfo.ColumnIndex

            'Si le click est intervenu dans la zone de titre
            If x_pos = -1 And y_pos <> -1 Then

                'On fait un glisser/déplacer du texte contenu dans le titre
                dgvSource.DoDragDrop(dgvSource.DataSource.Columns(y_pos).caption, DragDropEffects.Move)
            End If
        End If
    End Sub
    Private Sub dgv_ParamSeg_DragDrop(ByVal sender As Object, _
                                      ByVal e As System.Windows.Forms.DragEventArgs) _
                                      Handles dgv_ParamSegDC.DragDrop, dgv_ParamSegINCINV.DragDrop, _
                                      dgv_ParamSegEst.DragDrop

        Dim dgvDest As DataGridView = CType(sender, DataGridView)
        _ctrlCible = dgvDest

        'Si le dragDrop provient d'une listView
        If TypeOf (_ctrlSource) Is ListView Then

            Dim nomParametre As String

            'On récupère le paramètre en cours (quelle bouton est coché ?)
            If dgvDest Is dgv_ParamSegDC Then
                nomParametre = recup_paramFromNomButtonChecked(nomBouttonCocheDC)
            ElseIf dgvDest Is dgv_ParamSegINCINV Then
                nomParametre = recup_paramFromNomButtonChecked(nomBouttonCocheINCINV)
            Else
                nomParametre = recup_paramFromNomButtonChecked(nomBouttonCocheEst)
            End If

            'Traitement des nouvelles valeurs possibles pour ce paramètre
            '   - On grise la textBox du paramètre en cours
            Dim txtAMAJ As Control = tbc_ImportEncours.Controls.Find(txtBoxFromClePara(nomParametre), True)(0)
            'On désactive les contrôles de la TextBox
            txtAMAJ.Enabled = False

            '   - On fait la liste de tous les noms de colonnes présentes dans la segmentaton des valeurs
            Dim listeVarSegParam As List(Of String) = _controleurParametres.getValeursSeg(nomParametre)

            'A remplacer pour la gestion d'une collection
            ''listeVarSegParam.Add(nom_colonne)
            Dim ltvSource = CType(_ctrlSource, ListView)
            'Récupération des items sélectionnés
            Dim draggedItems As ListView.SelectedListViewItemCollection = ltvSource.SelectedItems

            'Récupération du traitement relatif à la segmentation du paramètre
            'S'il n'existe pas, il faut l'initialiser
            Dim reqParam As RequeteBDD
            If dgvDest Is dgv_ParamSegDC Or dgvDest Is dgv_ParamSegINCINV Then
                reqParam = _universBDD.listeTraitements.getTraitRegSegmentationParam(nomParametre)
                For Each draggedItem As ListViewItem In draggedItems
                    reqParam.addSELECT(_universBDD.listeTraitements.getTraitTbleEncoursPrep1.nom, draggedItem.Text)
                Next
                reqParam.isDISTINCT = True
            Else

                reqParam = _universBDD.listeTraitements.getTraitRegSegmentationParamSens(nomParametre)
                For Each draggedItem As ListViewItem In draggedItems
                    If nomParametre <> nomTxMort_Actu Then
                        reqParam.addSELECT(_universBDD.listeTraitements.getTraitTbleEncoursPrep1.nom, draggedItem.Text)
                        reqParam.addGROUPBY(_universBDD.listeTraitements.getTraitTbleEncoursPrep1.nom, draggedItem.Text)
                    Else
                        reqParam.addSELECT(_universBDD.listeTraitements.getTraitTbleEncoursPrep2.nom, draggedItem.Text)
                        reqParam.addGROUPBY(_universBDD.listeTraitements.getTraitTbleEncoursPrep2.nom, draggedItem.Text)
                    End If
                Next

            End If

            Dim d As DataTable
            If dgvDest Is dgv_ParamSegDC Or dgvDest Is dgv_ParamSegINCINV Then
                If nomParametre <> nomSel_medic Then
                    d = reqParam.execute_DataTable(True)
                    _controleurParametres.setValeursFromExt(nomParametre, d)
                Else
                    d = reqParam.execute_DataTable(True)
                    _controleurParametres.setValeursFromExt(nomParametre, d)
                    dgvDest.DataSource = _controleurParametres.getValeursDataTable(nomParametre)
                    dgvDest.Columns("abatSelMedic").DisplayIndex = dgvDest.Columns.Count - 1
                    dgvDest.Columns("abatSelMedic").HeaderText = "Abattement appliqué sur le taux de mortalité"
                    dgvDest.Columns("nbAnneesDerlt").DisplayIndex = dgvDest.Columns.Count - 2
                    dgvDest.Columns("nbAnneesDerlt").HeaderText = "Nombre d'années après la souscription"
                End If
            Else
                d = reqParam.execute_DataTableToDgv(True, dgvDest)
                'Méthode surchargée pour un paramètre de sensibilité
                _controleurParametres.setValeursDataTable(nomParametre, d)
            End If

        End If
    End Sub

#Region "Validation des valeurs de la dataGrid à intégrer"

    Private Sub dgv_ParamSegDC_DataError(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles dgv_ParamSegDC.DataError
        If e.Exception IsNot Nothing AndAlso e.Context = DataGridViewDataErrorContexts.Commit Then
            MsgBox("Les données saisies doivent^être numériques")
        End If
    End Sub
    Private Sub dgv_ParamSegDC_CellValidating(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles dgv_ParamSegDC.CellValidating
        Try
            'Appeler la fonction de validation du contrôleur
            If dgv_ParamSegDC.Columns(e.ColumnIndex).Name = parametreSelectionMedicale.nomAbattementSelMedi Then
                Dim valeurConvertie As String
                If Microsoft.VisualBasic.GetChar(e.FormattedValue, e.FormattedValue.ToString.Length) = "%" Then
                    Dim valeurStr As String = Microsoft.VisualBasic.Left(e.FormattedValue, e.FormattedValue.ToString.Length - 1)
                    valeurConvertie = CDbl(valeurStr) / 100
                Else
                    valeurConvertie = CDbl(e.FormattedValue)
                End If
                If Not valeurConvertie <= 1 Then
                    dgv_ParamSegDC.Rows(e.RowIndex).ErrorText = "Le champs doit être inférieur ou égal à 1"
                    e.Cancel = True
                End If
            End If
        Catch ex As Exception
            dgv_ParamSegDC.Rows(e.RowIndex).ErrorText = "La valeure saisie doit être numérique"
            e.Cancel = True
        End Try
    End Sub
    ''Private Sub dgv_ParamSegDC_CellValidated(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv_ParamSegDC.CellValidated
    ''    dgv_ParamSegDC.Rows(e.RowIndex).ErrorText = String.Empty
    ''End Sub
    Private Sub dgv_ParamSegDC_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv_ParamSegDC.CellEndEdit
        dgv_ParamSegDC.Rows(e.RowIndex).ErrorText = String.Empty
    End Sub
#End Region

#End Region

#Region "Gestion des listView - Visualisation des variables de segmentation disponibles"

    'Evenements permettant de gérer les glisser-déposer
    'Depuis la liste des variables de segmentation vers le dataset du paramétrage
    Private Sub ltv_ParamSeg_ItemDrag(ByVal sender As Object, _
                                         ByVal e As System.Windows.Forms.ItemDragEventArgs) _
                                         Handles ltv_ParamSegEst.ItemDrag, ltv_ParamSegDC.ItemDrag, _
                                         ltv_ParamSegINCINV.ItemDrag
        Dim ltvSce As ListView = CType(sender, ListView)
        _ctrlSource = ltvSce
        Try
            If Not ltvSce.SelectedItems Is Nothing Then
                ltvSce.DoDragDrop(ltvSce.SelectedItems, DragDropEffects.Move)
            End If
        Catch ex As Exception
        End Try
    End Sub
    Private Sub ltv_ParamSeg_DragEnter(ByVal sender As Object, _
                                       ByVal e As System.Windows.Forms.DragEventArgs) _
                                       Handles ltv_ParamSegDC.DragEnter, ltv_ParamSegEst.DragEnter, _
                                       ltv_ParamSegINCINV.DragEnter
        If TypeOf (_ctrlSource) Is ListView Then
            For i As Integer = 0 To e.Data.GetFormats().Length - 1
                If e.Data.GetFormats()(i).Equals _
                    ("System.Windows.Forms.ListView+SelectedListViewItemCollection") Then
                    e.Effect = e.AllowedEffect
                End If
            Next
        End If
        If TypeOf (_ctrlSource) Is DataGridView Then
            e.Effect = e.AllowedEffect
        End If
    End Sub
    Private Sub ltv_ParamSeg_DragDrop(ByVal sender As Object, _
                                         ByVal e As System.Windows.Forms.DragEventArgs) _
                                         Handles ltv_ParamSegDC.DragDrop, ltv_ParamSegINCINV.DragDrop, _
                                         ltv_ParamSegEst.DragDrop

        Dim ltvDest As ListView = CType(sender, ListView)
        _ctrlCible = ltvDest

        'S'il s'agit d'un glisser déposer dans la même listView
        If Not TypeOf (_ctrlSource) Is ListView Then

            'Paramètre en cours
            Dim nomParametre As String
            'Descriptions des correspondances présentes dans la segmentation des valeurs
            Dim listeVarSegParam As List(Of String)
            Dim dgvDest As DataGridView

            'Récupération du paramètre en cours d'affichage sur la fenêtre (quelle bouton est coché ?)
            If ltvDest Is ltv_ParamSegDC Then
                nomParametre = recup_paramFromNomButtonChecked(nomBouttonCocheDC)
                dgvDest = dgv_ParamSegDC
            ElseIf ltvDest Is ltv_ParamSegINCINV Then
                nomParametre = recup_paramFromNomButtonChecked(nomBouttonCocheINCINV)
                dgvDest = dgv_ParamSegINCINV
            Else
                nomParametre = recup_paramFromNomButtonChecked(nomBouttonCocheEst)
                dgvDest = dgv_ParamSegEst
            End If

            'Récupération de la colonne glissée/déposée
            Dim nomItem As String = e.Data.GetData(DataFormats.Text).ToString
            'Récupération des noms des variable de segmentation du paramètre
            listeVarSegParam = _controleurParametres.getValeursSeg(nomParametre)
            listeVarSegParam.Remove(_universBDD.Segmentation.Retenue.Item(nomItem).chOutil.Nom)

            'MAJ de la listView destinataire du glisser / déposer
            Dim lCorrespRetirees As New Dictionary(Of String, Correspondance)
            lCorrespRetirees.Add(nomItem, _universBDD.Segmentation.Retenue.Item(nomItem))
            ltvFunc_modifCollCorresp(ltvDest, lCorrespRetirees, operationCollection.ADD)

            Dim reqParam As RequeteBDD
            If ltvDest Is ltv_ParamSegDC Or ltvDest Is ltv_ParamSegINCINV Then
                reqParam = _universBDD.listeTraitements.getTraitRegSegmentationParam(nomParametre)
                reqParam.removeSELECT(nomItem)
            Else
                reqParam = _universBDD.listeTraitements.getTraitRegSegmentationParamSens(nomParametre)
                reqParam.removeSELECT(nomItem)
                reqParam.removeGROUPBY(nomItem)
            End If

            'Si la liste des variables de segmentation du paramètre est désormais vide :
            If listeVarSegParam.Count = 0 Then
                If nomParametre <> nomSel_medic Then
                    '   - On active la textBox du paramètre en cours
                    Dim txtAMAJ As PTIC_Composants_WF.PTIC_NumFormatedTextBox = tbc_ImportEncours.Controls.Find(txtBoxFromClePara(nomParametre), True)(0)
                    _controleurParametres.setValeurUniqueFromValeurAffichee(nomParametre, txtAMAJ.value)
                    txtAMAJ.Text = txtAMAJ.value
                Else
                    _controleurParametres.getControleur(nomSel_medic).setValeursDataTableFromExt(Nothing)
                End If
            Else



                Dim d As DataTable
                If ltvDest Is ltv_ParamSegDC Or ltvDest Is ltv_ParamSegINCINV Then
                    If nomParametre <> nomSel_medic Then
                        d = reqParam.execute_DataTable(True)
                        _controleurParametres.setValeursFromExt(nomParametre, d)
                    Else
                        d = reqParam.execute_DataTable(True)
                        _controleurParametres.setValeursFromExt(nomParametre, d)
                        dgvDest.DataSource = _controleurParametres.getValeursDataTable(nomParametre)
                        dgvDest.Columns("abatSelMedic").DisplayIndex = dgvDest.Columns.Count - 1
                        dgvDest.Columns("abatSelMedic").HeaderText = "Abattement appliqué sur le taux de mortalité"
                        dgvDest.Columns("nbAnneesDerlt").DisplayIndex = dgvDest.Columns.Count - 2
                        dgvDest.Columns("nbAnneesDerlt").HeaderText = "Nombre d'années après la souscription"
                    End If
                Else
                    d = reqParam.execute_DataTableToDgv(True, dgvDest)
                    'Méthode surchargée pour un paramètre de sensibilité
                    _controleurParametres.setValeursDataTable(nomParametre, d)
                End If

            End If
        End If

    End Sub

#End Region

#Region "Entrée dans les onglets"
    Private Sub tbp_Estimateurs_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles tbp_Estimateurs.Enter
        refreshParamEst()
    End Sub
#End Region

#End Region

#Region "Actualisations de la vue"
    'A fragmenter : actualise textBox, actualise contenu des dataGrid
    'Si le nom du paramètre venant d'être modifié correspond au nom d'un paramètre coché
    'alors mettre à jour la dataGrid correspondante. Si le changement de valeur provient d'une dataGrid, pas besoin
    'de la mettre à jour, elle l'est déjà.
    'Si le changement de valeur provient d'une textBox, alors ça ne sert à rien de MAJ la textBox correspondante,
    'elle l'est déjà.
    'Lorsqu'un radioButton est coché, il faut mettre à jour la dataGrid active

    'La fonction actualise réagit en fonction de l'objet observé (sender) qui a été modifié et l'objet concerné
    '(notification)
    Public Function actualise(ByVal sender As Object, ByVal notification As Object) As resultatValidationContraintes Implements IObserver.actualise

        If TypeOf sender Is IParamV2 Then
            Dim paramModifie As IParamV2 = sender
            Dim nomParametre As String = paramModifie.nom
            actualiseParamControl(nomParametre)
            actualiseParamDataGridView(nomParametre)
            actualiseParamLtv(nomParametre)
            actualiseParamDesc(nomParametre)
            Return New resultatValidationContraintes
        ElseIf TypeOf sender Is UniversOMANE Then
            'Actualiser tous les paramètres
            For i = 0 To _correspTxtBox_Param.GetUpperBound(0)
                actualiseParamDesc(_correspTxtBox_Param(i, 1))
            Next

        ElseIf TypeOf sender Is Segmentation Then

            Dim notifModifSegmentation As Segmentation.notification = notification.notification
            Dim lSegAmodifier As List(Of Correspondance) = notification.listeSegments
            Dim dicoListSegments As New Dictionary(Of String, Correspondance)
            For Each corresp As Correspondance In lSegAmodifier
                dicoListSegments.Add(corresp.description, corresp)
            Next

            If notifModifSegmentation = Segmentation.notification.ModifSegmentsRetenus Then
                Dim operation As operationCollection = notification.operation
                ltvFunc_modifCollCorresp(ltv_ParamSegDC, dicoListSegments, operation)
                ltvFunc_modifCollCorresp(ltv_ParamSegINCINV, dicoListSegments, operation)
                ltvFunc_modifCollCorresp(ltv_ParamSegEst, dicoListSegments, operation)
            End If

        End If
        Return Nothing
    End Function

    Public Sub refreshParamEst()
        actualiseParamControl(nomDuree_Actu)
        actualiseParamDataGridView(nomDuree_Actu)
        actualiseParamLtv(nomDuree_Actu)
        actualiseParamDesc(nomDuree_Actu)
    End Sub

    ''' <summary>
    ''' Actualise l'activation d'un paramètre en fonction de la méthode retenue
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function actualiseParamDesc(ByVal nomParametre As String) As Boolean
        Dim nomControlParametre As String = txtBoxFromClePara(nomParametre)
        If nomParametre <> csteParam.nomTx_CommiContA Then

            If nomParametre <> csteParam.nomSel_medic Then
                'Recherche du paramètre dans le tableau de correspondance avec les contrôles
                Dim numLigneParam As Integer
                For i As Integer = 0 To _correspTxtBox_Param.GetUpperBound(0)
                    If _correspTxtBox_Param(i, 1) = nomParametre Then numLigneParam = i
                Next
                'Récupération du numéro de la méthode
                Dim numethode As Integer = _universBDD.numMethodeCalculEnCours
                Dim isParametreActif As Boolean = _controleurParametres.getMethode_cal(nomParametre)(numethode - 1)
                Controls.Find(_correspTxtBox_Param(numLigneParam, 0), True)(0).Enabled = isParametreActif And _controleurParametres.getNature(nomParametre) <> paramNature.Declinee
                Controls.Find(_correspTxtBox_Param(numLigneParam, 2), True)(0).Enabled = isParametreActif And _controleurParametres.getNature(nomParametre) <> paramNature.Declinee
                If _correspTxtBox_Param(numLigneParam, 4) <> "" Then
                    Controls.Find(_correspTxtBox_Param(numLigneParam, 4), True)(0).Enabled = isParametreActif
                End If

            Else
                Dim isMethodeActive As Boolean = _controleurParametres.getMethode_cal(nomParametre)(_universBDD.numMethodeCalculEnCours - 1)
                lbl_Param16.Enabled = isMethodeActive
                NumUpDown_Param16.Enabled = isMethodeActive And Rdb_Param16.Checked
                Rdb_Param16.Enabled = isMethodeActive
            End If
        End If
    End Function
    ''' <summary>
    ''' Actualise la textBox ou la comboBox d'un paramètre
    ''' </summary>
    ''' <param name="nomParametre"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function actualiseParamControl(ByVal nomParametre As String)

        Dim nomControlParametre As String = txtBoxFromClePara(nomParametre)
        Dim ctrl As Control
        'Annulation de la prise en compte des modifications de la textBox (la valeur affectée au paramètre est valide
        'puisqu'elle a été affectée). Néanmoins, il faut faire un test pour vérifier que lorsque l'élément ne change
        'pas il n'est pas modifié.
        txtParamPriseEnCompteModifs = False

        If _bln_actualiseTextBox = True And nomParametre <> csteParam.nomTx_CommiContA Then

            ctrl = Controls.Find(nomControlParametre, True)(0)

            If nomParametre <> nomSel_medic Then
                If _controleurParametres.getNature(nomParametre) = paramNature.Unique Then
                    ctrl.Enabled = True
                    If TypeOf (ctrl) Is TextBox Then
                        CType(ctrl, PTIC_Composants_WF.PTIC_NumFormatedTextBox).value = _controleurParametres.getValeurUnique(nomParametre)
                    ElseIf TypeOf (ctrl) Is ComboBox Then
                        If ctrl.Name = "cbx_Param13" Then
                            CType(ctrl, ComboBox).SelectedItem = _controleurParametres.getValeurUniqueAffichee(nomParametre)
                        Else
                            CType(ctrl, ComboBox).SelectedValue = _controleurParametres.getValeurUnique(nomParametre)
                        End If
                    End If
                Else
                    If TypeOf (ctrl) Is TextBox Then CType(ctrl, TextBox).Text = ""
                    If _controleurParametres.getNature(nomParametre) = paramNature.Declinee Then ctrl.Enabled = False Else ctrl.Enabled = True
                End If
            Else
                NumUpDown_Param16.Value = CType(_universBDD.ListeParametres, ParametresList).Sel_medic.maxDeroulement
                If Rdb_Param16.Checked Then
                    NumUpDown_Param16.Enabled = True
                Else
                    NumUpDown_Param16.Enabled = False
                End If
            End If

        End If

        'On recherche le contrôle ayant été modifié txtBoxFromClePara(paramModifie.nom)
        txtParamPriseEnCompteModifs = True
        Return True

    End Function
    ''' <summary>
    ''' Actualise la dataGridView des valeurs d'un paramètre (n'a d'effet que si le paramètre est actif)
    ''' </summary>
    ''' <param name="nomParametre"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function actualiseParamDataGridView(ByVal nomParametre As String)

        'Pour le DC, l'INCAP/INVAL et les estimateurs, on récupère le nom du bouton coché
        Dim nomParamSelectionneDC As String = recup_paramFromNomButtonChecked(nomBouttonCocheDC)
        Dim nomParamSelectionINCINV As String = recup_paramFromNomButtonChecked(nomBouttonCocheINCINV)
        Dim nomParamSelectionEST As String = recup_paramFromNomButtonChecked(nomBouttonCocheEst)
        Dim dgvAMAJ As DataGridView = Nothing
        Dim traitementFormats As RequeteBDD = Nothing
        If nomParametre = nomParamSelectionneDC Then
            dgvAMAJ = dgv_ParamSegDC
            traitementFormats = _universBDD.listeTraitements.getTraitRegSegmentationParam(nomParametre)
        ElseIf nomParametre = nomParamSelectionINCINV Then
            dgvAMAJ = dgv_ParamSegINCINV
            traitementFormats = _universBDD.listeTraitements.getTraitRegSegmentationParam(nomParametre)
        ElseIf nomParametre = nomParamSelectionEST Then
            dgvAMAJ = dgv_ParamSegEst
            traitementFormats = _universBDD.listeTraitements.getTraitRegSegmentationParamSens(nomParametre)
        End If

        'Si le paramètre modifié correspond à un bouton coché, la mise à jour du dataGridView est effectuée
        If Not dgvAMAJ Is Nothing Then
            dgvAMAJ.SelectionMode = DataGridViewSelectionMode.RowHeaderSelect
            dgvAMAJ.DataSource = _controleurParametres.getValeursDataTable(nomParametre)
            If Not traitementFormats Is Nothing Then
                MAJdgvFormats(traitementFormats.ListeChampsSortie, dgvAMAJ)
            End If
            If dgvAMAJ.Columns.Contains(nomParametre) Then dgvAMAJ.Columns(nomParametre).HeaderText = _controleurParametres.getDescription(nomParametre)
            If nomParametre = nomSel_medic Then
                If dgvAMAJ.Columns.Contains(Actuariat.parametreSelectionMedicale.nomAbattementSelMedi) Then dgvAMAJ.Columns(Actuariat.parametreSelectionMedicale.nomAbattementSelMedi).HeaderText = Actuariat.parametreSelectionMedicale.descAbattementSelMedi
                If dgvAMAJ.Columns.Contains(Actuariat.parametreSelectionMedicale.nomNbAnneesDeroulement) Then dgvAMAJ.Columns(Actuariat.parametreSelectionMedicale.nomNbAnneesDeroulement).HeaderText = Actuariat.parametreSelectionMedicale.descNbAnneesDeroulement
                If dgvAMAJ.Columns.Contains(Actuariat.parametreSelectionMedicale.nomAbattementSelMedi) Then dgvAMAJ.Columns(Actuariat.parametreSelectionMedicale.nomAbattementSelMedi).DefaultCellStyle.Format = "#,##0.0 %"
                If dgvAMAJ.Columns.Contains(Actuariat.parametreSelectionMedicale.nomNbAnneesDeroulement) Then dgvAMAJ.Columns(Actuariat.parametreSelectionMedicale.nomNbAnneesDeroulement).DefaultCellStyle.Format = "#,###"
            End If

            'On remet la colonne de paramétrage à droite
            Dim b1 As Boolean = False
            For Each col As DataGridViewColumn In dgvAMAJ.Columns
                If col.HeaderText = _controleurParametres.getDescription(nomParametre) Then
                    b1 = True
                    col.DisplayIndex = dgvAMAJ.Columns.Count - 1
                End If
            Next
        End If
        Return True
    End Function
    ''' <summary>
    ''' Actualise la listView des segments possibles d'un paramètre (n'a d'effet que si le paramètre est actif)
    ''' </summary>
    ''' <param name="nomParametre"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function actualiseParamLtv(ByVal nomParametre As String)
        'Pour le DC, l'INCAP/INVAL et les estimateurs, on récupère le nom du bouton coché
        Dim nomParamSelectionneDC As String = recup_paramFromNomButtonChecked(nomBouttonCocheDC)
        Dim nomParamSelectionINCINV As String = recup_paramFromNomButtonChecked(nomBouttonCocheINCINV)
        Dim nomParamSelectionEST As String = recup_paramFromNomButtonChecked(nomBouttonCocheEst)
        Dim ltvAMAJ As ListView = Nothing
        If nomParametre = nomParamSelectionneDC Then
            ltvAMAJ = ltv_ParamSegDC
        ElseIf nomParametre = nomParamSelectionINCINV Then
            ltvAMAJ = ltv_ParamSegINCINV
        ElseIf nomParametre = nomParamSelectionEST Then
            ltvAMAJ = ltv_ParamSegEst
        End If

        If Not ltvAMAJ Is Nothing Then
            'Mise à jour des variables de segmentation non utilisée pour décliner les valeurs
            'du paramètre
            Dim listVarSegDispo As Dictionary(Of String, Correspondance)
            Dim listVarSegUtilisee As List(Of String)
            Dim listVarSegNonUtilisee As New Dictionary(Of String, Correspondance)

            'Récupération des variables de segmentation possibles et des variables de segmentation utilisées
            'par le paramètre
            Dim b As Boolean = False
            listVarSegDispo = _universBDD.Segmentation.Retenue
            listVarSegUtilisee = _controleurParametres.getValeursSeg(nomParametre)

            'Mise à jour de la liste des variables non utilisées
            For Each corresp As Correspondance In listVarSegDispo.Values
                For Each s1 As String In listVarSegUtilisee
                    If corresp.chOutil.Nom = s1 Then b = True
                Next
                If Not b Then listVarSegNonUtilisee.Add(corresp.description, corresp)
                b = False
            Next
            ltvFunc_modifCollCorresp(ltvAMAJ, listVarSegNonUtilisee, operationCollection.REPLACE)
        End If
        Return True
    End Function

#End Region

End Class